class Processo < ActiveRecord::Base
  INSTANCIAS = { :primeira => "Primeira", :segunda => "Segunda" }
  TIPOS = { :civel => "Cível", :criminal => "Criminal" }

  has_many    :apensos, :class_name => "Processo", :foreign_key => "matriz_id"
  has_many    :envolvimentos, :dependent => :destroy
  has_many    :envolvidos, :through => :envolvimentos, :order => "nome"
  has_many    :enquadramentos, :through => :envolvimentos
  has_many    :fundamentos
  belongs_to  :matriz, :class_name => "Processo", :foreign_key => "matriz_id"
  belongs_to  :cartorio
  belongs_to  :promotoria
  has_and_belongs_to_many :andamentos, :join_table => :historico_andamentos
  
  validates_inclusion_of  :instancia, :in => INSTANCIAS.values, :message => "A instância deve ser #{INSTANCIAS.values.to_sentence :connector => 'ou', :skip_last_comma => true}"
  validates_inclusion_of  :tipo, :in => TIPOS.values, :message => "O tipo deve ser #{TIPOS.values.to_sentence :connector => 'ou', :skip_last_comma => true}"
  validates_length_of     :codigo, :is => 12, :if => lambda { |p| not p.codigo.blank? }, :message => "O código deve possuir 12 caracteres"
  validates_presence_of   :codigo, :message => "Informe o código"
  validates_uniqueness_of :codigo, :message => "Já existe um processo com este código"
  
  attr_writer :codigo_matriz
  
  class << self
    def matrizes
      find :all, :conditions => "matriz_id is NULL"
    end
    
    def total_matrizes
      self.matrizes.size
    end
    
    def apensos
      find :all, :conditions => "matriz_id is not NULL"
    end
    
    def total_apensos
      self.apensos.size
    end
  end
  
  def is_matriz?
    matriz.nil?
  end
  
  def to_matriz
    self.matriz.apensos.delete(self) and self.reload if self.is_apenso?
  end
  
  def codigo_matriz
    self.matriz.codigo if self.is_apenso?
  end
  
  def is_apenso?
    not matriz.nil?
  end
  
  def to_apenso(codigo_matriz)
    # Assegura que o processo será anexado a uma instância de Processo
    self.matriz = (codigo_matriz.empty?)? new : Processo.find_or_initialize_by_codigo(codigo_matriz)
  end
  
  def has_apensos?
    not apensos.empty?
  end
  
  private
  
  def validate
    unless self.matriz.nil?
      unless Processo.find_by_codigo(self.codigo_matriz)
        if self.codigo_matriz.nil?
          errors.add(:codigo_matriz, 'Informe o código do processo matriz')
        else
          errors.add(:codigo_matriz, 'O processo matriz não existe. Verifique o código')
        end
      else
        if self.has_apensos?
          errors.add_to_base('Não é possível tornar um processo matriz que possui apensos em apenso')
        elsif self.matriz.is_apenso?
          errors.add(:codigo_matriz, 'Não é possível anexar um apenso a outro apenso. Verifique o código do processo matriz')
        end
      end
    end
  end
end